home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Comm / AmiTCP30b2.lha / src / amitcp / netinet / in_cksum.asm < prev    next >
Assembly Source File  |  1994-02-17  |  4KB  |  204 lines

  1. ;;; $Id: in_cksum.asm,v 1.2 1994/02/17 18:35:54 jraja Exp $
  2. ;;;
  3. ;;; in_cksum.s --- calculate internet checksum
  4. ;;;
  5. ;;; Author: ppessi <Pekka.Pessi@hut.fi>
  6. ;;;
  7. ;;; Copyright (c) 1993 AmiTCP/IP Group, <amitcp-group@hut.fi>,
  8. ;;;                    Helsinki University of Technology, Finland.
  9. ;;;
  10. ;;; Created      : Wed Oct 20 08:55:45 1993 ppessi
  11. ;;; Last modified: Thu Oct 21 03:18:26 1993 ppessi
  12. ;;;
  13. ;;; $Log: in_cksum.asm,v $
  14. ;; Revision 1.2  1994/02/17  18:35:54  jraja
  15. ;; Added __regargs entry point.
  16. ;;
  17. ;; Revision 1.1  1993/10/21  01:59:45  ppessi
  18. ;; Initial revision
  19. ;;
  20. ;; Revision 1.1  1993/10/21  01:59:45  ppessi
  21. ;; Initial revision
  22. ;;
  23. ;;;
  24.  
  25.     INCLUDE   "sys/mbuf.i"
  26.  
  27.     XREF    _printf
  28.     XDEF    _in_cksum
  29.     XDEF    @in_cksum
  30.  
  31. ** stack offsets for __stdargs
  32. m_off        set    $4
  33. len_off        set    $8
  34.  
  35. ** registers for __regargs
  36. m_reg        equr    a0
  37. len_reg         equr    d0
  38.  
  39. m        equr    a0
  40. w        equr    a1
  41. end        equr    a2
  42.  
  43. len        equr    d7
  44. mlen        equr    d6
  45. sum        equr    d5
  46. zero        equr    d4
  47. spanning    equr    d3
  48. byte_swapped    equr    d2
  49.  
  50.         section      text,code
  51. _in_cksum:
  52.         move.l    m_off(sp),m_reg
  53.         move.l  len_off(sp),len_reg 
  54. @in_cksum:
  55.         movem.l d2-d7/a2/a3/a5/a6,-(sp)
  56. * a0 to a0    move.l  m_reg,m
  57.         move.l    len_reg,len
  58.         moveq    #0,sum
  59.         move.l    sum,spanning
  60.         move.l    sum,zero
  61.         bra     loop_test
  62.  
  63. loop:        cmp.l    mlen,len
  64.         bge    sk01
  65.         move.l    len,mlen
  66. sk01:        sub.l    mlen,len
  67.         movea.l    M_DATA(m),w
  68.         tst.l    spanning
  69.         beq.s    no_spanning
  70. *
  71. * The first byte of this mbuf is the continuation
  72. * of a word spanning between this mbuf and the
  73. * last mbuf.
  74. *
  75.         move.l    zero,d0
  76.         move.b    (w)+,d0
  77.         add.l    d0,sum
  78.         addx.l    zero,sum
  79.         addx.l    zero,sum
  80.         ; End of buffer?
  81.         subq.l    #1,mlen
  82.         move.l    mlen,spanning
  83.         beq.w    next
  84. *
  85. * Force to word boundary
  86. *
  87. no_spanning:    move.l    w,byte_swapped
  88.         andi.l    #1,byte_swapped
  89.         beq.s    onword
  90. *
  91. * Swap sum bytes
  92. *
  93.         rol.l    #8,sum    
  94.         move.l    zero,d0
  95.         move.b    (w)+,d0
  96.         add.l    d0,sum
  97.         addx.l    zero,sum
  98.         addx.l    zero,sum
  99.         subq.l    #1,mlen
  100. *
  101. * Force to long boundary
  102. *
  103. onword:        move.l    w,d0
  104.         andi.b    #3,d0
  105.         beq    onlong
  106.         moveq    #-2,d0
  107.         add.l    mlen,d0
  108.         blt    loop2out
  109.         move.l    d0,mlen
  110.         add.w    (w)+,sum
  111.         addx.l    zero,sum
  112.         addx.l    zero,sum
  113. onlong:        move.l    mlen,d0
  114.         ror.l    #5,d0
  115.         add.l    zero,zero    ; clear X
  116.         bra    loop32test
  117. *
  118. * Main loop
  119. *        
  120. loop32:        move.l    (w)+,d1
  121.         addx.l    d1,sum
  122.         move.l    (w)+,d1
  123.         addx.l    d1,sum
  124.         move.l    (w)+,d1
  125.         addx.l    d1,sum
  126.         move.l    (w)+,d1
  127.         addx.l    d1,sum
  128.         move.l    (w)+,d1
  129.         addx.l    d1,sum
  130.         move.l    (w)+,d1
  131.         addx.l    d1,sum
  132.         move.l    (w)+,d1
  133.         addx.l    d1,sum
  134.         move.l    (w)+,d1
  135.         addx.l    d1,sum
  136. loop32test:    dbf.s    d0,loop32
  137.         moveq    #31,d0
  138.         and.l    mlen,d0
  139.         ror.l    #2,d0
  140.         bra.s    loop4test
  141. loop4:        move.l    (w)+,d1
  142.         addx.l    d1,sum    
  143. loop4test:    dbf    d0,loop4
  144. *            
  145. * A single word still in mbuf?
  146. *
  147.         moveq    #2,d0
  148.         and.l    mlen,d0
  149.         beq    loop2out
  150.         move.w    (w)+,d1
  151.         addx.w    d1,sum
  152. *
  153. * A single byte still in mbuf?
  154. *
  155. loop2out:    addx.l    zero,sum
  156.         addx.l    zero,sum
  157.         moveq    #1,spanning
  158.         and.l    mlen,spanning
  159.         beq    loop1out
  160.         move.l    zero,d0
  161.         move.b    (w)+,d0
  162.         rol.l    #8,d0
  163.         addx.w    d0,sum
  164.         addx.l    zero,sum
  165.         addx.l    zero,sum
  166.  
  167. loop1out:    tst.l    byte_swapped
  168.         beq    next
  169.         ; bytes were swapped, swap them back
  170.         rol.l    #8,sum
  171.         ; Invert spanning status
  172.         subq.l    #1,spanning        
  173. next:        movea.l    M_NEXT(m),m
  174. loop_test:    move.l    m,d0
  175.         beq.s    return
  176.         tst.l    len
  177.         beq.s    return
  178. *        if (m->m_len == 0)
  179. *            continue;
  180.         move.l    M_LEN(m),mlen
  181.         beq.s    next
  182.         bra.w    loop
  183. return:        tst.l    len
  184.         beq.s    reduce
  185.         pea    out_of_data(pc)
  186.         jsr    _printf(pc)
  187.         addq.l    #4,sp
  188. *
  189. * Reduce
  190. *
  191. reduce:        move.l    zero,d0
  192.         move.w    sum,d0
  193.         swap    sum
  194.         add.w    sum,d0
  195.         addx.w    zero,d0
  196.         eori.w    #$ffff,d0
  197.         movem.l    (a7)+,d2-d7/a2/a3/a5/a6
  198.         rts
  199.         
  200. out_of_data:    dc.b    'cksum: out of data',10,0
  201.         
  202.         end
  203.